home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / ada / gwuada_5.zip / adaed / nyudemos / semaphor.ada < prev    next >
Text File  |  1992-09-01  |  2KB  |  72 lines

  1. ----------------------------------------------------------------------
  2. --
  3. --                    Semaphore Package
  4. --
  5. --                      written by
  6. --
  7. --                   Edmond Schonberg
  8. --
  9. --                      Ada Project
  10. --                   Courant Institute
  11. --                  New York University
  12. --                   251 Mercer Street
  13. --                New York, New York  10012
  14. --
  15. -----------------------------------------------------------------------
  16.  
  17. package SEMAPHORE is
  18.  
  19.    generic
  20.  
  21.       INIT: NATURAL;  -- initial value of semaphore
  22.  
  23.    package COUNT_SEMAPHORE is
  24.    
  25.       task COUNTING_SEMAPHORE is --similar to Amoroso's counting semaphore
  26.            entry P;
  27.            entry V;
  28.       end COUNTING_SEMAPHORE;
  29.  
  30.    end COUNT_SEMAPHORE;
  31.  
  32.    task type BINARY_SEMAPHORE is -- implements binary semaphores as suggested by
  33.         entry P;                 -- Amoroso and Ingargiola.
  34.         entry V;
  35.    end BINARY_SEMAPHORE;   
  36.  
  37.    type ACCESS_BINARY_SEMAPHORE is access BINARY_SEMAPHORE;
  38.  
  39. end SEMAPHORE;
  40.  
  41. package body SEMAPHORE is
  42.  
  43.    package body COUNT_SEMAPHORE is
  44.  
  45.       task body COUNTING_SEMAPHORE is
  46.            S: INTEGER := INIT;
  47.       begin
  48.            loop    -- run forever, waiting for P or V to be called
  49.                select
  50.                   when S > 0 => accept P; S := S - 1;
  51.                or
  52.                   accept V; S := S + 1; -- S > INIT implies that new resources
  53.                end select;              -- became available that were originally
  54.            end loop;                    -- unknown. This is not like Amoroso's
  55.        end COUNTING_SEMAPHORE;          -- version.
  56.     
  57.     end COUNT_SEMAPHORE;
  58.  
  59.     task body BINARY_SEMAPHORE is
  60.     begin
  61.       loop
  62.      select
  63.              accept P;
  64.      or
  65.          terminate ;
  66.          end select ;
  67.          accept V;
  68.       end loop;
  69.     end BINARY_SEMAPHORE;
  70.  
  71. end SEMAPHORE;
  72.